--[[ 怒首领蜂大复活黑版脚本,
  
  按下w键切换自动开火的功能,但在按住A键时并不自动开火.
  这样效果就是不按键时自动shot,按A激光,按S列怒
  
  By setycyas @2025-03-07
]]

--防止重复运行
if (_G.game) then
  print('script already loaded!')
  return
end
--模块调用
local myMame = require('MyMame')
local myStg = require('MySTG')
-- 本模块,定义时设定基本参数
local GAME = {
  -- 脚本名,提示与分辨用
  NAME = "dfkbl_autoboot",
  --
  -- 分辨率
  Y_RESOLUTION = 240.0, X_RESOLUTION = 320.0,
  -- 坐标地址,高位,都用read_u16读取
  Y_ADDR = 0x0c939d68, X_ADDR = 0x0c939d68+4,
  --0ca05ea1,0c939d69
  -- 火力与蓄力地址
  --POW_ADDR = 0x0605505b,CHARGE_ADDR = 0x06055074,
  -- 像素平移
  Y_OFFSET = 0, X_OFFSET = 0,
  -- 中心参考线线颜色,宽度
  LINE_WIDTH = 1.2, LINE_COLOR = 0xA0A000A0,
  
  -- 自动连射标记
  autofireFlag = false,
  -- A键的轮询队列
  seqA = manager.machine.input:seq_from_tokens("KEYCODE_A"),
  -- 更新模块参数函数
  refreshModule = function(self)
    myMame.gameName = self.NAME
    myMame.screenIndex, myStg.screenIndex = ':screen', ':screen'
    myStg.X_RESOLUTION, myStg.Y_RESOLUTION = self.X_RESOLUTION, self.Y_RESOLUTION
  end
}
-- 更新模块参数
GAME:refreshModule()

-- 获取坐标,返回整数
function GAME.getY()
  local y
  y = myMame.mem:read_u16(GAME.Y_ADDR)
  return y+GAME.Y_OFFSET
end
function GAME.getX()
  local x
  x = myMame.mem:read_u16(GAME.X_ADDR)
  return x+GAME.X_OFFSET
end

-- 监视各地址,测试时用投入使用时不显示,把需要监视的地址加入addrArr数组
function GAME.watchAddrs()
  local addrArr, strArr
  addrArr = {}
  myMame.showInfo(strArr)
end

-- 显示监视的数据
function GAME.check()
  local x, y
  x = myMame.mem:read_u16(GAME.X_ADDR)
  y = myMame.mem:read_u16(GAME.Y_ADDR)
  myMame.ui_container:draw_text(0, 0, "X="..x.." Y="..y, 0xFF005500, 0xFFcccccc)
end


-- 显示辅助线
function GAME.showAssist()
  myMame.ui_container:draw_box(0.495, 1.0, 0.505, 0.97, 0xDD0000dd, 0xDD0000dd)
end

-- 显示中心十字线
function GAME.showCross(x, y)
 
  if (x > 0) and (y > 0) then
    -- 中心参考线
    myStg.xLine(x, GAME.LINE_COLOR, GAME.LINE_WIDTH)
    myStg.yLine(y, GAME.LINE_COLOR, GAME.LINE_WIDTH)
  end
  
end

-- 自动开火
function GAME.autofire()
  local str, field
  field = manager.machine.ioport.ports[":PORT_D"].fields["P1 Button 3"] -- 开火键
  if GAME.autofireFlag then
    str = " ON  "
    if manager.machine.input:seq_pressed(GAME.seqA) then
      field:set_value(0) -- 按住A键不开火
    else
      field:set_value(1) -- 开火
    end
  else
    str = " OFF "
  end
  -- 状态显示
  myMame.container:draw_text(0, 0, str, 0xFF005500, 0xFFcccccc)
end

-- 切换自动开火
function GAME.toggleAutofire()
  local field
  field = manager.machine.ioport.ports[":PORT_D"].fields["P1 Button 3"] -- 开火键
  GAME.autofireFlag = not GAME.autofireFlag
  -- 切换开火状态
  if GAME.autofireFlag then
    field:set_value(1)
  else
    field:set_value(0)
  end
end

-- 主函数,绑定后每一帧执行一次该函数
function GAME.Main()
--
  local x, y
  
  x, y = GAME.getX(), GAME.getY()
  
  -- 监视数据
  --GAME.watchAddrs()
  -- 辅助线
  GAME.showAssist()
  -- 数据监视
  --GAME.check()
  -- 中心参考线
  GAME.showCross(x, y)
  -- 自动开火
  GAME.autofire()

end

-- [[运行]]

-- 绑定每一帧执行的函数
--myMame.debugRunPerFrame(GAME.Main, 'dfkbl')
myMame.runPerFrame(GAME.Main, 'dfkbl')
-- 导出到全局变量
_G.game = GAME
-- 绑定热键函数
myMame.setHotkey("KEYCODE_W", GAME.toggleAutofire)

return GAME
